

package com.wedu.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wedu.common.exception.RRException;
import com.wedu.common.utils.PageUtils;
import com.wedu.common.utils.Query;
import com.wedu.modules.sys.dao.SysConfigDao;
import com.wedu.modules.sys.redis.SysConfigRedis;
import com.google.gson.Gson;
import com.wedu.modules.sys.entity.SysConfigEntity;
import com.wedu.modules.sys.service.SysConfigService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Map;

//标识业务逻辑层（Service层）的注解，扫描这个包，并且注入到ioc容器中	起到@Service的作用
@Service("sysConfigService")
//IService实现类提供了对sys_config数据库的增删改查
public class SysConfigServiceImpl extends ServiceImpl<SysConfigDao, SysConfigEntity> implements SysConfigService {
	//依赖导入
	@Autowired
	private SysConfigRedis sysConfigRedis;//根据类型自动注入Bean对象
//	方法重写
	@Override
	//创建一个公共的返回值是分页工具类的queryPage方法（查询页面）传入的形参是map类型的params
	public PageUtils queryPage(Map<String, Object> params) {//string为t
		//从params中获取paramKey字段的值   paramKey 是一个查询条件，用来模糊匹配数据库中 param_key 字段的值
		String paramKey = (String)params.get("paramKey");
		//调用了分页查询方法，返回一个类型为IPage<SysConfigEntity>（分页对象接口）的分页对象
		IPage<SysConfigEntity> page = this.page(
			//创建一个分页对象  params 中提取分页参数（如当前页码、每页条数等）
			new Query<SysConfigEntity>().getPage(params),
			//查询条件构造器在SysConfigEntity表中
			new QueryWrapper<SysConfigEntity>()
					//模糊查询先检查paramKey不为空，查询表中param_key字段与paramKey字段一样的数据
				.like(StringUtils.isNotBlank(paramKey),"param_key", paramKey)
					//查询条件，status为1（没有被删除）
				.eq("status", 1)
		);
		//返回查询的页面将分页数据封装（返回）到工具类中
		return new PageUtils(page);
	}

	@Override
	//保存配置信息的方法 形参是SysConfigEntity实体类
	public void saveConfig(SysConfigEntity config) {
		//往数据库中保存数据
		this.save(config);
		//调用添加或修改方法添加或修改config
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	//声明一个方法需要在事务中执行  指定哪些异常类型会触发事务回滚，异常的属性为Exception.class
	@Transactional(rollbackFor = Exception.class)//避免部分提交导致数据不一致 多次处理数据库才加这个
	//更新数据的方法
	public void update(SysConfigEntity config) {
		//根据id更新数据
		this.updateById(config);
		//调用调用添加或修改方法添加或修改config
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	//定义一个方法（根据key更新value）传入两个值
	public void updateValueByKey(String key, String value) {
		//更新，根据key更新value
		baseMapper.updateValueByKey(key, value);
		//删除Redis缓存中与key相关的缓存数据
		sysConfigRedis.delete(key);
	}
	/**
	 * 	<!-- 根据key，更新value -->
	 * 	<update id="updateValueByKey" parameterType="map">
	 * 		update sys_config set param_value = #{paramValue} where param_key = #{paramKey}
	 * 	</update>
	 * */

	@Override
	@Transactional(rollbackFor = Exception.class)
	//用于批量删除数据的方法
	public void deleteBatch(Long[] ids) {
		//遍历ids
		for(Long id : ids){
			//根据id获取数据库中的id
			SysConfigEntity config = this.getById(id);
			//根据config获取paramKey来删除缓存中的信息
			sysConfigRedis.delete(config.getParamKey());
		}
		//逻辑删除数据库中的内容 根据ids中的id批量删除 将数组转化为list集合
		this.removeByIds(Arrays.asList(ids));
	}


	/**
	 * 系统加的
	 * */
	@Override
	public String getValue(String wx_init_password) {
		return null;
	}

}
